# 协程,又叫做微线程, 纤程, Coroutine
# 进程 > 线程 > 协程(纤程)
# 协程: 另外一种实现多任务的方式，只不过比线程更小. 它自带CPU上下文，这样只要在合十的时机，就可以把一个纤程钱换到另外一个纤程

# python -m pip install gevent

# greenlet 由 C语言实现的协程模块,通过 switch()来实现任意函数之间的切换

import gevent
import time

# gevent: 遇到IO操作时，会自动切换，属于主动式切换
# 注意: 文件命名不要和第三方库重名
# 注意: 协程不能使用阻塞式的代码
# 注意: 主进程不能使用阻塞式的代码

# gevent.spawn(函数名): 创建协程对象
# gevent.sleep(): 耗时操作
# gevent.join() :阻塞,等待某个协程结束
# gevent.joinall(): 等待所有协程对象结束后再退出, 参数是一个协程对象列表


def sing():
    print("Singing")
    gevent.sleep(2)
    print("End Singing")


def dance():
    print("Dancing")
    gevent.sleep(3)
    print("End Dancing")


if __name__ == "__main__":
    g1 = gevent.spawn(sing)
    g2 = gevent.spawn(dance)

    g1.join()
    g2.join()

    print("Perfect show.")
